package communicationUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

import protocol.*;

import communicationTCP.Dictionnary;

public class Serveur_UDP {

	public static void main(String args[]){
		byte[] reponse = new byte[256];
		DatagramPacket packet = new DatagramPacket(reponse, 256);
		Dictionnary dico = new Dictionnary();
		boolean exit = false;
		Request request;
		
		DatagramSocket datagram;
		try {
			datagram = new DatagramSocket(1025);
			try {
				//Attendre la reception d'un paquet
				while (!exit) {
					System.out.println("attente d'un paquet");
					datagram.receive(packet);
					UDP_to_Objet obj = new UDP_to_Objet(packet);
					request = obj.transform_to_Objet();
					Answer rep = null;
					String liste = null;
					
					//Traiter la requete en fonction du type reçu
					switch (request.getType()) {
					case ADD:
						protocol.Add requeteA = (Add) request;
						if (dico.add(requeteA.getNickname(), requeteA.getName())) {
							rep = new Answer("Enregistrement effectue|");
						} else {
							rep = new Answer("Surnom existant|");
						}
						//Envoyer la réponse au client
						envoyerRepDatagram(rep.getFeedback(), datagram, packet.getAddress(), packet.getPort());
						break;
					case LIST:
						protocol.List requeteL = (List) request;
						//Vérifier si un nom est précisé pour la requete
						if(requeteL.getName() == null) {
							liste = new String();
							if (dico.getListe() != null) {
								rep = new Answer("Liste", dico.getListe());
								liste = rep.getFeedback();
								liste += " : ";
								liste += rep.getResults().toString();
								liste += "|";
	
							} else {
								rep = new Answer("Liste vide|");
								liste = rep.getFeedback();
							}
						}
						//Traiter le cas où un nom est précisé
						else {
							liste = new String();
							if (dico.getListe() != null) {
								rep = new Answer("Liste", dico.list(requeteL.getName()));
								liste = rep.getFeedback();
								liste += " : ";
								liste += rep.getResults().toString();
								liste += "|";
							} else {
								rep = new Answer(
										"Pas d'enregistrement trouve pour ce nom|");
								liste = rep.getFeedback();
							}							
						}
						//Envoyer la réponse au client
						envoyerRepDatagram(liste, datagram,
								packet.getAddress(), packet.getPort());
						break;
					//Fermer le serveur
					case EXIT:
						System.out.println("fermeture du serveur");
						exit = true;
						break;
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	//Envoyer un datagram au client
	static void envoyerRepDatagram(String rep, DatagramSocket datagram,
			InetAddress address, int port) {
		byte[] rep1 = new byte[rep.length()];
		rep1 = rep.getBytes();
		System.out.println(rep);
		DatagramPacket paquet = new DatagramPacket(rep1, rep1.length, address,
				port);
		try {
			datagram.send(paquet);
		} catch (IOException e) {
			e.printStackTrace();
		}		
	}
}
